# pinout 显示GPIO 电路
# https://zhuanlan.zhihu.com/p/639150428?utm_id=0
# https://www.kancloud.cn/gouxf/gouxf_0219/1095821
import RPi.GPIO as GPIO  # type: ignore
import time
import os


# LED闪烁
def blink_led():
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(11, GPIO.OUT)
    try:
        while True:
            GPIO.output(11, True)  # 将 GPIO17 (11) 引脚设置为高电平
            x1 = GPIO.input(11)  # 获取 GPIO 引脚的电平状态
            print(x1)
            time.sleep(0.5)  # 持续一秒
            GPIO.output(11, False)  # 将 GPIO17 (11) 引脚设置为低电平
            x1 = GPIO.input(11)  # 获取 GPIO 引脚的电平状态
            print(x1)
            time.sleep(0.8)  # 持续0.8秒
    except KeyboardInterrupt:
        GPIO.cleanup()  # 清除 GPIO 引脚并退出应用


# PWM LED呼吸灯
def pwm_breathing_led():
    GPIO.setmode(GPIO.BOARD)  # 设置 GPIO 引脚模式为 BOARD
    GPIO.setup(11, GPIO.OUT)  # 设置 GPIO17 (11) 引脚为输出模式
    pwm = GPIO.PWM(11, 100)  # 设置 GPIO17 (11) 引脚为 PWM 输出，频率为 50Hz
    pwm.start(0)  # 开始 PWM 输出，初始占空比为 0%
    try:
        while True:
            for duty_cycle in range(0, 101, 5):  # 逐渐增加占空比
                pwm.ChangeDutyCycle(duty_cycle)  # 更新占空比
                time.sleep(0.1)  # 持续0.01秒
            for duty_cycle in range(100, -1, -5):  # 逐渐减小占空比
                pwm.ChangeDutyCycle(duty_cycle)  # 更新占空比
                time.sleep(0.1)  # 持续0.1秒
    except KeyboardInterrupt:
        pwm.stop()  # 停止 PWM 输出
        GPIO.cleanup()  # 清除 GPIO 引脚并退出应用


# vcgencmd measure_temp 直接运行也可获取到温度，需要sudo权限
# 树莓派五秒获取一次温度保存到txt 文件中 ，超过2024年8月3日20:00:00停止采集
def get_temp():
    # 数据采集到2024年8月3日
    while True:
        # 若超过2024年8月3日20:00:00，则停止采集
        if time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) > "2024-08-03 20:00:00":
            break
        # 当前时间 当前温度存储到txt文件中
        temp = (
            time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
            + " "
            + os.popen("vcgencmd measure_temp").readline()
        )
        print(temp)
        # temp = os.popen('vcgencmd measure_temp').readline()
        with open("temp..xlsx", "a") as f:
            f.write(temp)
        time.sleep(5)  # 5秒采集一次


# 根据参数不同执行不同的方法
if __name__ == "__main__":
    # blink_led()
    pwm_breathing_led()
    # get_temp()
